package com.ouc.yyi.springcloud.gateway.security;

import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.ouc.yyi.springcloud.gateway.consts.Const;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.Charset;

/**
 * @description: 解密处理安全类
 * @author: yyi
 * @date: 2022/8/21 19:12
 * @version: 1.0
 **/
@Service
@Slf4j
@PropertySource(value = "classpath:application.yml")
public class SecurityService {


    private final SymmetricCrypto sm4 = SmUtil.sm4(Const.EN_KEY.getBytes());

    /**
     * @description: 对请求的数据进行解密操作， 解密使用国密的sm4进行加解密
     * @param: s 入参 请求的体（未解密之前的数据）
     * @return:
     * @author: yyi
     * @date: 2022/9/02 8:36
     * @version: 1.0
    **/
    public Mono<String> modifyRequest(ServerWebExchange exchange, String s) {
        log.info("解密之前的数据是:" + s);
        //获取到加密串
        //{"value": "加密数据"}
        JSONObject entries = JSONUtil.parseObj(s);
        Object value = entries.get("value");
        String s1 = sm4.decryptStr(value.toString(), Charset.defaultCharset());
        exchange.getResponse().getHeaders().set("decrpt", "1");
        log.info("解密之后的数据是:" + s1);
        return Mono.just(s1);
    }

    /**
     * @description: 对响应的数据进行加密 使用hutool的国密加密算法进行导出
     * @param: s 入参， 响应体（未加密前的数据）
     * @return:
     * @author: yyi
     * @date: 2022/8/22 8:37
     * @version: 1.0
    **/
    public Mono<String> modifyResponse(ServerWebExchange exchange, String s) {
        log.info("加密之前的数据是:" + s);
        String s1 = sm4.encryptHex(s.getBytes());
        log.info("加密之后的数据为:" + s1);
        exchange.getResponse().getHeaders().set("decrpt", "1");
        return Mono.just(s1);
    }

}
